#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
struct node{
    int num;
    int t[maxn];
    int numm[maxn];
    friend bool operator< (node px,node py)
    {
        return px.num>py.num;
    }
};
int T;
int vis[maxn];
int vis1[maxn];
int ans1;
int n,m;
int c;
int d[maxn];
int L,V;
priority_queue<node> q;
int main()
{
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    scanf("%d",&T);
    while(T--)
    {
        ans1=0;
        memset(vis,0,sizeof(vis));
        memset(d,0,sizeof(d));
        scanf("%d%d%d%d",&n,&m,&L,&V);
        for(int i=1;i<=n;i++)
        {
            int x,v,a;
            scanf("%d%d%d",&x,&v,&a);
            if(a==0)
                c++;
            if(v>=V)
                d[i]=x;
            else if(a==0)
                continue;
            else if(a>0)
            {
                 double xx=(V*V-v*v)/2/a*1.0;
                 d[i]=xx+x;;
                 if(d[i]>L)
                    d[i]=0;
            }
            else{

            }


        }
        for(int i=1;i<=m;i++)
        {
            node temp;

            int z;
            scanf("%d",&z);
            for(int j=1;j<=n;j++)
            {
                if(d[j]>z)
                {

                    temp.t[j]=1;
                    temp.num++;
                    temp.numm[temp.num]=j;
                    if(!vis[j])
                        ans1++;
                    vis[j]=1;

                }

            }
            q.push(temp);
        }
        if(ans1==0)
        {
            printf("0 %d\n",m);
        }
        if(c==n)
        {
            printf("%d ",ans1,m-1);
        }
        else{
            int ans2=1;
            node tempp=q.top();
            node xx;
            while(q.size())
            {
                if(tempp.num==n)
                    break;
                xx=q.top();
                q.pop();
                bool jud=0;
                for(int nn=1;nn<=xx.num;nn++)
                {
                    if(!tempp.t[xx.numm[nn]])
                    {
                       // ans2++;
                        jud=1;
                        tempp.t[xx.numm[nn]]=1;
                    //    break;
                    }
                }
                if(jud)
                {
                    ans2++;
                }
            }

             printf("%d %d\n",ans1,ans2);
        }

    }
    return 0;
}
